﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;
using System.Collections.Specialized;
using System.Web;
using Lcsoft.UrlRewriter.Errors;

namespace Lcsoft.UrlRewriter.Utilities
{
	/// <summary>
	/// 为请求的地址重写提供上下文信息。
	/// </summary>
	public interface IContextFacade
	{
		/// <summary>
		/// 获取 <see cref="MapPath"/>。
		/// </summary>
		MapPath MapPath { get; }

		/// <summary>
		/// 返回应用程序路径。
		/// </summary>
		/// <returns></returns>
		string GetApplicationPath();

		/// <summary>
		/// 返回原始请求地址。
		/// </summary>
		/// <returns>包含原始请求地址的 <see cref="System.String"/>。</returns>
		string GetRawUrl();

		/// <summary>
		/// 返回当前请求地址。
		/// </summary>
		/// <returns>包含当前请求地址的 <see cref="System.String"/>。</returns>
		Uri GetRequestUrl();

		/// <summary>
		/// 设置 HTTP 状态码。
		/// </summary>
		/// <param name="code">HTTP 状态码。</param>
		void SetStatusCode(int code);

		/// <summary>
		/// 重写当前请求地址为指定路径。
		/// </summary>
		/// <param name="url">要重写到的虚拟路径。</param>
		void RewritePath(string url);

		/// <summary>
		/// 设置 URL 转向。
		/// </summary>
		/// <param name="url">要跳转到的 URL。</param>
		void SetRedirectLocation(string url);

		/// <summary>
		/// 在标题信息集合末尾追加一个新的标头。
		/// </summary>
		/// <param name="name">标头信息名称。</param>
		/// <param name="value">标头信息的值。</param>
		void AppendHeader(string name, string value);

		/// <summary>
		/// 在 <see cref="HttpCookie"/> 集合末尾追加一个新的 <see cref="HttpCookie"/>。
		/// </summary>
		/// <param name="cookie"><see cref="HttpCookie"/>。</param>
		void AppendCookie(HttpCookie cookie);

		/// <summary>
		/// 处置错误信息。
		/// </summary>
		/// <param name="handler">一个错误处理提供程序的实例。</param>
		void HandleError(IRewriteErrorHandler handler);

		/// <summary>
		/// 设置上下文信息中的自定义键值对中指定键的值。
		/// </summary>
		/// <param name="item">键名。</param>
		/// <param name="value">键值。</param>
		void SetItem(object item, object value);

		/// <summary>
		/// 获取上下文信息中的自定义键值对中指定键的值。
		/// </summary>
		/// <param name="item">键名。</param>
		/// <returns>键值。</returns>
		object GetItem(object item);

		/// <summary>
		/// 获取当前请求的类型。
		/// </summary>
		/// <returns>表示当前请求类型的 <see cref="System.String"/>。</returns>
		string GetHttpMethod();

		/// <summary>
		/// 返回服务器变量信息的集合。
		/// </summary>
		/// <returns><see cref="NameValueCollection"/>。</returns>
		NameValueCollection GetServerVariables();

		/// <summary>
		/// 返回标头信息集合。
		/// </summary>
		/// <returns><see cref="NameValueCollection"/>。</returns>
		NameValueCollection GetHeaders();

		/// <summary>
		/// 返回 <see cref="HttpCookie"/> 的集合。
		/// </summary>
		/// <returns><see cref="HttpCookieCollection"/>。</returns>
		HttpCookieCollection GetCookies();
	}
}
